昨天雖然有成功達成下拉式選單, 但是
檔案右下角的三角形是甚麼?!!!
即使我加了
tb.setArrowType(Qt.NoArrow)
這句一樣存在!!!
東翻西找後把上面那句用 setStyleSheet 代替就可以了~~
tb.setStyleSheet("QToolButton::menu-indicator { image: None; }")
對結果非常滿意~
接下來先完成檔案選單內裡的長相, 雖然沒有真的功能, 但至少要好看, 另外, 發現 __init__ 太多行了, 決定把設置外觀的程式碼分出來變成新的 function
一樣, 這次圖標來源為 Flaticon
import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.tb = QToolButton(self)
self.tb.setText("檔案")
self.tb.setAutoRaise(True)
self.tb.setStyleSheet("QToolButton::menu-indicator { image: None; }")
self.tb.setCursor(Qt.PointingHandCursor)
self.setupFileToolButton()
def setupFileToolButton(self):
menu = QMenu("Menu", self)
menu.setCursor(Qt.PointingHandCursor)
newMenu = QMenu("新文件", self)
newMenu.setIcon(QIcon("icon\document.png"))
doc = QAction(QIcon("icon\document (1).png"), "文件", self)
useExample = QAction(QIcon("icon\edit-alt.png"), "使用範本", self)
newMenu.addAction(doc)
newMenu.addAction(useExample)
open = QAction(QIcon("icon\_folder.png"), "開啟", self)
open.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_O))
open.setShortcutContext(Qt.ApplicationShortcut)
makeCopy = QAction(QIcon("icon\duplicate.png"), "建立副本", self)
rename = QAction(QIcon("icon\edit.png"), "重新命名", self)
move = QAction(QIcon("icon\_book-arrow-right.png"), "移動", self)
delete = QAction(QIcon("icon\\trash.png"), "移至垃圾桶", self)
menu.addMenu(newMenu)
menu.addAction(open)
menu.addAction(makeCopy)
menu.addSeparator()
menu.addAction(rename)
menu.addAction(move)
menu.addAction(delete)
self.tb.setMenu(menu)
self.tb.setPopupMode(QToolButton.InstantPopup)
if __name__ == "__main__":
app = QApplication([])
widget = MyWidget()
widget.resize(300, 300)
widget.show()
sys.exit(app.exec())
展示
喔~~~ 完美!!
在這裡發現了一件事, 就是使用圖片時, 如果發現圖片顯示不出來, 請注意圖片名稱第一個字, 有兩種方法可以解決
另外在這裡還使用了一個叫做 setShortcut 的功能, 簡單來說就是設置快捷鍵
但想要在 Menu 後方顯示此動作的快捷鍵的話要再加上
open.setShortcutContext(Qt.ApplicationShortcut)
這樣就會像一般應用程式一樣, 有圖示, 有功能名稱也顯示快捷鍵
但為了讓讀者看到快捷鍵有效, 決定在這裡加回加數字的小功能
import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.num = 0
layout = QVBoxLayout(self)
self.setLayout(layout)
self.label = QLabel("0", alignment = Qt.AlignCenter)
layout.addWidget(self.label)
self.tb = QToolButton(self)
self.tb.setText("檔案")
self.tb.setAutoRaise(True)
self.tb.setStyleSheet("QToolButton::menu-indicator { image: None; }")
self.tb.setCursor(Qt.PointingHandCursor)
self.setupFileToolButton()
def setupFileToolButton(self):
menu = QMenu("Menu", self)
menu.setCursor(Qt.PointingHandCursor)
newMenu = QMenu("新文件", self)
newMenu.setIcon(QIcon("icon\document.png"))
doc = QAction(QIcon("icon\document (1).png"), "文件", self)
useExample = QAction(QIcon("icon\edit-alt.png"), "使用範本", self)
newMenu.addAction(doc)
newMenu.addAction(useExample)
open = QAction(QIcon("icon\_folder.png"), "開啟", self)
open.triggered.connect(self.addOne)
open.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_O))
open.setShortcutContext(Qt.ApplicationShortcut)
makeCopy = QAction(QIcon("icon\duplicate.png"), "建立副本", self)
rename = QAction(QIcon("icon\edit.png"), "重新命名", self)
move = QAction(QIcon("icon\_book-arrow-right.png"), "移動", self)
delete = QAction(QIcon("icon\\trash.png"), "移至垃圾桶", self)
menu.addMenu(newMenu)
menu.addAction(open)
menu.addAction(makeCopy)
menu.addSeparator()
menu.addAction(rename)
menu.addAction(move)
menu.addAction(delete)
self.tb.setMenu(menu)
self.tb.setPopupMode(QToolButton.InstantPopup)
def addOne(self):
self.num = self.num + 1
self.label.setText(str(self.num))
if __name__ == "__main__":
app = QApplication([])
widget = MyWidget()
widget.resize(300, 300)
widget.show()
sys.exit(app.exec())
在我箭頭放在螢幕中央不動時, 其實我正在案 CTRL+O, 由這次展示可以看出快捷鍵有成功設置
不過, 加了 layout 後, ToolButton 的長相也變了, 不知道為甚麼, 雖然影響不大啦